Odoo ORM 更適合處理大多數日常應用中的 CRUD 操作,而 SQL 則在性能優化和處理複雜查詢時更加靈活。不囉說,先上精彩的對照表格。
SQL DML vs Odoo ORM 比較表
功能 | SQL | Odoo ORM |
---|---|---|
Create | INSERT INTO Customers (Name, Address, Phone) VALUES (...) |
self.env['my_module.customers'].create({...}) |
Read | SELECT * FROM Customers WHERE Name = 'John Doe' |
self.env['my_module.customers'].search([('name', '=', 'John Doe')]) |
Update | UPDATE Customers SET Phone = '0987654321' WHERE Name = 'John' |
customer.write({'phone': '0987654321'}) |
Delete | DELETE FROM Customers WHERE Name = 'John Doe' |
customer.unlink() |
Join | SELECT ... FROM Customers JOIN Orders ON ... |
使用關聯字段 (Many2one, One2many) 自動處理表關聯,通過 order_ids 等獲取相關聯的訂單資料 |
文章架構
一樣我們參考昨天的範例,將原本的 Excel->SQL 對應,延伸至 SQL->Odoo ORM 的應用。
【Day15】零基礎 ERP 關聯式資料庫 (Relational Database):操作表格資料 (DML)
SQL 實作
SELECT Name, Phone
FROM Customers
WHERE City = 'Taipei';
Odoo ORM 對應
使用 search 方法來查詢資料。
# 查詢 City 為 'Taipei' 的 Customers
customers = self.env['my_module.customers'].search([('city', '=', 'Taipei')])
# 遍歷查詢結果並打印客戶名稱和電話
for customer in customers:
print("Name:", customer.name, "Phone:", customer.phone)
SQL 實作
INSERT INTO Customers (CustomerID, CustomerName, Phone)
VALUES (101, 'John Doe', '123456789');
Odoo ORM 對應
使用 create 方法來插入資料。
# 插入客戶資料
new_customer = self.env['customers'].create({
'customer_id': 101,
'name': 'John Doe',
'phone': '123456789'
})
SQL 實作
UPDATE Customers
SET Phone = '987654321'
WHERE CustomerID = 101;
Odoo ORM 對應
使用 write 方法來更新資料。
# 更新客戶電話
customer = self.env['customers'].search([('customer_id', '=', 101)])
if customer:
customer.write({'phone': '987654321'})
SQL 實作
DELETE FROM Customers
WHERE CustomerID = 101;
Odoo ORM 對應
使用 unlink 方法來刪除資料。
# 刪除客戶
customer = self.env['customers'].search([('customer_id', '=', 101)])
if customer:
customer.unlink()
SQL 實作
SELECT Customers.CustomerName, Orders.OrderDate
FROM Customers
JOIN Orders ON Customers.CustomerID = Orders.CustomerID;
Odoo ORM 對應
【Day14】運用 Odoo ORM 在資料庫建立,簡易電商顧客訂單模型
from odoo import models, fields
# 定義 Customers 模型
class Customers(models.Model):
_name = 'my_module.customers' # 資料庫表名稱
_description = 'Customers Table'
customer_id = fields.Integer(string='Customer ID', required=True, index=True) # 主鍵
name = fields.Char(string='Name', required=True) # 客戶名稱
address = fields.Char(string='Address') # 客戶地址
phone = fields.Char(string='Phone') # 電話
# 定義 Orders 模型
class Orders(models.Model):
_name = 'my_module.orders' # 資料庫表名稱
_description = 'Orders Table'
order_id = fields.Integer(string='Order ID', required=True, index=True) # 主鍵
order_date = fields.Date(string='Order Date') # 訂單日期
customer_id = fields.Many2one('my_module.customers', string='Customer', ondelete='cascade') # 外鍵,關聯到 Customers 表
# 查詢所有 Customers 及其 Orders 資料
customers = self.env['my_module.customers'].search([])
# 遍歷所有 Customers 並取得其 Orders
for customer in customers:
for order in customer.order_ids:
print("Customer Name:", customer.name, "Order Date:", order.order_date)
在 Odoo 17 ORM API 中,SQL 中的 JOIN 通常由 ORM 自動處理,根據模型中的關聯字段(如 Many2one)來實現跨表的資料檢索。對應於 SQL 的 JOIN 操作,可以使用 Odoo 的 search 或 browse 方法來進行多表的關聯查詢。
【Day14】運用 Odoo ORM 在資料庫建立,簡易電商顧客訂單模型
功能 | SQL | Odoo ORM |
---|---|---|
Create | INSERT INTO Customers (Name, Address, Phone) VALUES (...) |
self.env['my_module.customers'].create({...}) |
Read | SELECT * FROM Customers WHERE Name = 'John Doe' |
self.env['my_module.customers'].search([('name', '=', 'John Doe')]) |
Update | UPDATE Customers SET Phone = '0987654321' WHERE Name = 'John' |
customer.write({'phone': '0987654321'}) |
Delete | DELETE FROM Customers WHERE Name = 'John Doe' |
customer.unlink() |
Join | SELECT ... FROM Customers JOIN Orders ON ... |
使用關聯字段 (Many2one, One2many) 自動處理表關聯,通過 order_ids 等獲取相關聯的訂單資料 |
Odoo ORM 雖然不直接使用 SQL 語句,但它通過關聯字段的自動處理和高層次的 API 設計,使得開發者可以更高效地進行 CRUD 和複雜的關聯查詢操作,同時保持數據庫的操作簡單且安全。
【Day14】運用 Odoo ORM 在資料庫建立,簡易電商顧客訂單模型
【Day15】零基礎 ERP 關聯式資料庫 (Relational Database):操作表格資料 (DML)